package com.feng.one;

import java.util.LinkedHashMap;

public class CreateAndDisplay2 {
    public static void main(String[] args) {
        //创建结点
        HeroNode node1 = new HeroNode(101,"宋江","及时雨");
        HeroNode node2 = new HeroNode(102,"卢俊义","玉麒麟");
        HeroNode node3 = new HeroNode(103,"吴用","智多星");

        //创建单链表
        SingleLinkedList2 linkedList = new SingleLinkedList2();
        //添加结点
        linkedList.add(node1);
        linkedList.add(node3);
        linkedList.add(node2);

        //遍历链表
        linkedList.Display();

        HeroNode node4 = new HeroNode(103,"吴用new","智多星new");

        linkedList.update(node4);
        System.out.println("修改后的链表");
        linkedList.Display();

        System.out.println("删除后的链表");
        linkedList.delete(103);
        linkedList.Display();
    }
}


//定义结点
class HeroNode2{
    public int no;
    public String name;
    public String nikeName;
    public HeroNode next;//指向下一个结点

    public HeroNode2(int no, String name, String nikeName) {
        this.no = no;
        this.name = name;
        this.nikeName = nikeName;
    }

    @Override
    public String toString() {
        return "HeroNode{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", nikeName='" + nikeName + '\'' +
                '}';
    }
}

//定义单链表
class SingleLinkedList2{
    //初始化头结点
    private HeroNode head = new HeroNode(0,"","");

    //添加结点到链表，以no大小为顺序添加
    public void add(HeroNode heroNode){
        //head头结点不能动，需要一个辅助遍历
        HeroNode temp = head;
        //遍历链表，判断下一个结点的no是否大于当前要添加的结点的no
        boolean f = false;//false代表有相同的不能添加，否则可以添加
        while (true){
            if (temp.next==null){
                break;
            }
            if (temp.next.no==heroNode.no){
                f=true;//编号存在
                break;
            }else if (temp.next.no>heroNode.no){
                break;
            }
            temp=temp.next;//"指针“后移
        }
        if (f==true){
            System.out.println("编号已经存在，不能添加");
        }else {
            heroNode.next=temp.next;
            temp.next=heroNode;
        }
//        temp.next=heroNode;
    }

    //修改结点的信息：根据no修改
    public void update(HeroNode heroNode){
        if (head.next==null){
            System.out.println("链表为空");
            return;
        }

        /**
         * 更新方式一：
         */
        /*HeroNode temp = head.next;
        while (true){
            if (temp.no==heroNode.no){
                temp.name=heroNode.name;
                return;
            }
            temp=temp.next;
        }*/

        /**
         * 更新方式二：
         */
        /*HeroNode temp = head;
        while (true){
            if (temp.next.no==heroNode.no){
//                temp.name=heroNode.name;
                heroNode.next=temp.next.next;
                temp.next.next=heroNode;
                return;
            }
            temp=temp.next;
        }*/
       /* HeroNode temp = head;
        while (true){
            if (temp.no==heroNode.no){
                //直接替换掉满足条件的（no相同）temp.next结点
                if (temp.next.next!=null){
                    heroNode.next=temp.next.next;
                    temp.next=heroNode;
                }else if (temp.next!=null){
                    temp.next=heroNode;
                }else {
                    temp=heroNode;
                }

                return;
            }
            temp=temp.next;
        }*/
        HeroNode temp = head;
        while (true){
            if (temp.next!=null){
                if (temp.next.no==heroNode.no){
                    //直接替换掉满足条件的（no相同）temp.next结点
                    // if (temp.next!=null){//这里没有必要判断为空了，如果为空前面的不可能进入的
                    if (temp.next.next!=null){
                        heroNode.next=temp.next.next;
                        temp.next=heroNode;
                    }else {
                        temp.next=heroNode;
                    }
                    //    }
            /*else {
                    temp=heroNode;
                }*/
                    return;
                }
            }

            temp=temp.next;
        }
    }

    /**
     * Delete 结点
     * 和上面的修改方法类似
     */
    //根据no值删除对应的结点
    public void delete(int no){
        if(head.next==null){
            System.out.println("删除失败，链表为空");
            return;
        }
        HeroNode temp = head;
        while (true){
            if (temp.next!=null){
                if (temp.next.no==no){
                    if (temp.next.next!=null){
                        temp.next=temp.next.next;
                       // return;
                    }else {
                        temp.next=null;
                    }
                    return;
                }
            }
            temp=temp.next;
        }
    }

    //显示链表【遍历】
    public void Display(){
        if (head.next==null){
            System.out.println("链表为空");
            return;
        }
        HeroNode temp = head.next;
        while (true){
            if (temp==null){
                break;
            }
            System.out.println(temp);
            temp = temp.next;
        }
    }


}